10 REM RUBICS CLOCK==================== 20 REM BY ALFONS MITTELMEYER 30 REM 40 REM FUER COMMODORE COMPUTER 50 REM C116/C16/P4/C64/C128 60 REM 70 REM BEISPIEL FUER GUTEN 80 REM PROGRAMMIERSTIL 90 REM ================================ 100 REM RECHNERANPASSUNG 110 P=PEEK(772) 120 RX=781*(P=124)+2035*(P=86)+7*(P=13) 130 RX=-RX:RY=RX+1:GOTO1860 140 : 150 REM ----------- INITIALISIERUNG ----- 160 REM INIT 170 GOTO200 180 : 190 REM AUSGABEINIT 200 YK=3:XK=9:REM RAHMENPOSITION 210 LR$=" ":ZR$=CHR$(18)+" "+CHR$(146) 220 LF$=CHR$(17):BS$=CHR$(157) 230 WA$=CHR$(195):SE$=CHR$(194):LO$=CHR$(176):RO$=CHR$(174) 240 LU$=CHR$(173):RU$=CHR$(189):SI$=CHR$(122):SO$=CHR$(113) 250 : 260 REM VARINIT 270 DIM F(43) 280 VO=0:HI=22:ZE=13:SC=0 290 SC=0:RG=4:ZE=13:VO=0:HI=22 300 EC(0)=0:EC(1)=2:EC(2)=6:EC(3)=8 310 : 320 REM FUNKTIONEN 330 DEF FN YP(N)=INT(N/3)*6+YK+3 340 DEF FN XP(N)=(N-INT(N/3)*3)*7+XK+3 350 DEF FN EI(I)=F(I+VO) 360 DEF FN ZW(B)=(EC(A)+EC(B))/2 370 DEF FN KO(N)=ABS(N+12*((N=0)OR(N=13))) 380 DEF FN EX(N)=((I AND NOT N)OR(NOT I AND N)) 390 DEF FN WT(I)=(null)((null)(FNEI(X),FNEI(I)),1) 400 : 410 REM ZEITINIT 420 X=RND(-TI) 430 A=ZE+VO:FORI=A TO A+8:F(I)=INT(RND(1)*12+1):NEXT 440 A=ZE+HI:FORI=A TO A+8:F(I)=INT(RND(1)*12+1):NEXT 450 FOR I=0 TO 3:F(ZE+HI+EC(FNEX(1)))=FNKO(12-F(EC(I)+ZE)):NEXT 460 : 470 REM SCHALTINIT 480 A=SC+VO:FORI=A TO A+3:F(I)=0:NEXT 490 A=SC+HI:FORI=A TO A+3:F(I)=1:NEXT 500 RA=0:RETURN 510 : 520 REM ---------- AUSGABEROUTINEN ----- 530 REM PLOT 540 POKERX,Y:POKERY,X:SYS65520:RETURN 550 : 560 REM RAHMEN(YO,XL,YU,XR) VAR H,V,I,X,Y,A$,B$ 570 H=XR-XL-1:V=YU-YO-1 580 Y=YO:X=XL:A$=LO$:B$=RO$:GOSUB620:X=XR:GOSUB630 590 X=XL:GOSUB630:Y=YU:A$=LU$:B$=RU$:GOTO620 600 : 610 REM RAHMH(Y,X,A$,B$), RAHMV(Y,X) 620 GOSUB540: PRINTA$;: FORI=1 TO H: PRINTWA$;:NEXT: PRINTB$: RETURN 630 GOSUB540: FOR I=1 TO V: PRINTLF$SE$BS$;: NEXT: RETURN 640 : 650 REM UHRRAHMEN 660 YO=YK:YU=YK+18:XL=XK:XR=XK+21:GOSUB570 670 FOR J=0 TO 8:YO=FNYP(J)-1:YU=YO+2 680 XL=FNXP(J)-1:XR=XL+3:GOSUB570:NEXT:RETURN 690 : 700 REM SCHALTPLATZ(I) 710 X=XK+7+(I AND 1)*7:Y=YK+6+INT(I/2)*6:GOTO540 720 : 730 REM SCHALTSTELLUNG 740 A$=SI$:IF F(I+VO+SC)=0 THEN A$=SO$ 750 PRINTA$;:RETURN 760 : 770 REM ZEIGSCHALTER(I) 780 GOSUB710:GOTO740 790 : 800 REM SCHALTBILD 810 FOR I=0 TO 3: GOSUB780:NEXT:RETURN 820 : 830 REM ZEIGZEIT 840 FOR I=0 TO 8:X=FNXP(I):Y=FNYP(I):GOSUB540:PRINTRIGHT$(" "+STR$(F(I+ZE+VO)),2); 850 NEXT:RETURN 860 : 870 REM ZEIGRAD(RA) 880 GOSUB940:PRINTZR$;:RETURN 890 : 900 REM LOESCHRAD(RA) 910 GOSUB940:PRINTLR$;:RETURN 920 : 930 REM RADPLATZ(I) 940 X=XK-1+(RA AND 1)*23:Y=YK-1+INT(RA/2)*20:GOTO540 950 : 960 REM ----------- RIEGEL-LOGIK ------- 970 REM EINSUMME(/N) 980 N=0:A=SC+VO:FOR I=A TO A+3:N=N+F(I):NEXT:RETURN 990 : 1000 REM ECKRIEGELN 1010 FOR A=0 TO 3:I=FNEI(A):I=FNEX(FNEI(X)) 1020 F(VO+RG+EC(A))=FNEX(1):NEXT:RETURN 1030 : 1040 REM TEILRIEGELN 1050 GOSUB980:IF F(X+VO)=0 THEN 1110 1060 : 1070 REM UNTFALL 1080 ON N GOTO 1260,1200,1200,1200 1090 : 1100 REM OBFALL 1110 ON N+1 GOTO 1230,1230,1370,1200 1120 : 1130 REM ALLES(W) 1140 AD=RG+VO:FOR I=AD TO AD+8:F(I)=W:NEXT:RETURN 1150 : 1160 REM RIEGELN 1170 X=RA:GOSUB1050:GOSUB1520:I=X:X=FNEX(1):GOSUB1050:GOTO1520 1180 : 1190 REM VERRIEGELN 1200 W=0:GOSUB1140:GOTO1010 1210 : 1220 REM ENTRIEGELN 1230 W=1:GOSUB1140:GOTO1010 1240 : 1250 REM EINKNOPFUNTEN 1260 GOSUB1230:I=X:I=FNEX(3):A=I 1270 F(VO+RG+FNZW(FNEX(1)))=0 1280 F(VO+RG+FNZW(FNEX(2)))=0 1290 RETURN 1300 : 1310 REM WELCHE 1320 FOR I=0 TO 3 1330 IF FNEI(I)=1 THEN B=A:A=I 1340 NEXT:A=FNZW(B):RETURN 1350 : 1360 REM ZWEIKNOPFOBEN 1370 GOSUB1230:I=X 1380 IF FNEI(X)<>FNEI(FNEX(3))THENGOSUB1320:F(RG+VO+A)=0 1390 RETURN 1400 : 1410 REM ------------- TEILPROGRAMME --- 1420 REM NUMMER 1430 X=(ASC(C$)-1)AND3:RETURN 1440 : 1450 REM SCHALTEN 1460 GOSUB1490:GOTO1490 1470 : 1480 REM TEILSCHALTEN(X) 1490 A=X+SC+VO:I=F(A):F(A)=FNEX(1):GOSUB1520:I=X:X=FNEX(1):RETURN 1500 : 1510 REM WENDEN 1520 A=VO:VO=HI:HI=A:RETURN 1530 : 1540 REM SCHALTUNG 1550 GOSUB1430:GOSUB1460:I=X:GOSUB780:GOTO1170 1560 : 1570 REM WENDUNG 1580 GOSUB910:I=RA:RA=FNEX(1):GOSUB880 1590 GOSUB1520:GOSUB810:GOTO840 1600 : 1610 REM DREHEN 1620 GOSUB1650:X=-X:GOTO1650 1630 : 1640 TEILDREHEN 1650 AD=RG+VO:FOR I=AD TO AD+8 1660 IF F(I)=1 THEN F(I+9)=FNKO(F(I+9)+X) 1670 NEXT:GOTO1520 1680 : 1690 REM DREHUNG 1700 X=1:IF C$="-" THEN X=-1 1710 GOSUB1620:GOTO840 1720 : 1730 REM RADWAHL 1740 GOSUB910:GOSUB1900:GOSUB1430:RA=X:GOSUB880:GOTO1170 1750 : 1760 REM ------------- HAUPTPROGRAMM --- 1770 REM ANFANG 1780 PRINTCHR$(147):GOSUB170:GOSUB660:GOSUB810:GOSUB840:GOSUB880:GOTO1170 1790 : 1800 REM TASTWERTUNG 1810 N=0:FORI=1TO8:IFC$=MID$("1234.+-0",I,1) THEN N=I:I=8 1820 NEXT:ON N GOTO 1550,1550,1550,1550,1740,1700,1700,1580 1830 RETURN 1840 : 1850 REM HAUPTSCHLEIFE 1860 GOSUB1780 1870 GOSUB1900:GOSUB1810:GOTO1870 1880 : 1890 REM EINGABE 1900 GET C$:IF C$="" THEN 1900 1910 RETURN 1920 : 1930 REM =========== E N D E ===========